package dao;

import java.util.Date;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import utils.DateUtils;
import utils.XmlUtils;
import dominio.ItemRemitoProveedor;
import dominio.OrdenCompra;
import dominio.Proveedor;
import dominio.ReferenciaRemitoProveedor;
import dominio.RemitoProveedor;
import dominio.Rodamiento;

public class RemitoProveedorXmlDAO {
	private static RemitoProveedorXmlDAO instance;

	public static RemitoProveedorXmlDAO getInstance() {
		if (instance == null)
			instance = new RemitoProveedorXmlDAO();
		return instance;
	}

	private RemitoProveedorXmlDAO() {}

	public RemitoProveedor parse(Document xml) throws Exception {
		// Remito
		Element elementRemito = XmlUtils.getElement(xml, "Remito");
		if (elementRemito != null) {
			RemitoProveedor remito = new RemitoProveedor();
			// Fecha
			Date fecha = DateUtils.parse(elementRemito.getAttribute("fecha"));
			remito.setFecha(fecha);
			// Proveedor
			Proveedor proveedor = XmlUtils.parseProveedor(elementRemito);
			remito.setProveedor(proveedor);
			// Referencias
			Element elementReferencia = XmlUtils.getElement(elementRemito, "Referencia");
			if (elementReferencia != null) {
				NodeList ordenesCompra = elementReferencia.getElementsByTagName("OrdenCompra");
				for (int i = 0; i < ordenesCompra.getLength(); ++i)
					remito.agregarReferencia(parseReferencia((Element) ordenesCompra.item(i)));
				return remito;
			}
		}
		throw new Exception("Formato incorrecto del archivo XML.");
	}

	private ReferenciaRemitoProveedor parseReferencia(Element elementOrden) throws Exception {
		ReferenciaRemitoProveedor referencia = new ReferenciaRemitoProveedor();
		// OrdenCompra
		OrdenCompra orden = new OrdenCompra();
		orden.setId(Integer.parseInt(elementOrden.getAttribute("numero")));
		referencia.setOrdenCompra(orden);
		// Rodamientos
		Element elementRodamientos = XmlUtils.getElement(elementOrden, "Rodamientos");
		if (elementRodamientos == null)
			throw new Exception("Formato incorrecto del archivo XML.");
		NodeList items = elementRodamientos.getElementsByTagName("Item");
		for (int i = 0; i < items.getLength(); ++i) {
			Element elementItem = (Element) items.item(i);
			ItemRemitoProveedor item = parseItem(elementItem);
			referencia.agregarItem(item);
		}
		return referencia;
	}

	private ItemRemitoProveedor parseItem(Element item) throws Exception {
		// Serie
		String serie = item.getAttribute("serie");
		// Sufijo
		Element elementSufijo = XmlUtils.getElement(item, "Sufijo");
		// Marca
		Element elementMarca = XmlUtils.getElement(item, "Marca");
		// Pais
		Element elementPais = XmlUtils.getElement(item, "Origen");
		// Cantidad
		Element elementCantidad = XmlUtils.getElement(item, "Cantidad");
		if (serie != null && elementSufijo != null && elementMarca != null && elementPais != null && elementCantidad != null) {
			ItemRemitoProveedor i = new ItemRemitoProveedor();
			// Rodamiento
			Rodamiento r = new Rodamiento();
			r.setSerie(serie);
			r.setSufijo(elementSufijo.getTextContent());
			r.setMarca(elementMarca.getTextContent());
			r.setPais(elementPais.getTextContent());
			i.setRodamiento(r);
			// Cantidad
			i.setCantidad(Integer.parseInt(elementCantidad.getTextContent()));
			return i;
		}
		throw new Exception("Formato incorrecto del archivo XML.");
	}
}